Operator CxpCamera

Operator Library: Hardware Platform

此运算符代表 CXP 相机与 VisualApplets 之间的图像数据接口。该运算符可用于单通道、双通道或四通道 CXP 接口。接口类型通过参数 ConnectionCount 进行选择。无论相机交付什么格式,该运算符都会输出原始图像数据。随后,您需要将此图像数据转换为相机发送的格式。要转换图像数据,请使用适当的运算符来聚合原始字节值并将其转换(cast)为像素值。运行过程中的某些特定情况可以通过事件系统进行传达,如下所述。此外,该运算符还具有各种用于指示与相机连接状态的参数。

如果运算符检测到某个帧大于或小于相机在 CXP 图像标头(header)中声明的大小,则会激活安全电路。然后,运算符将截断超出范围的像素和行,以便 VisualApplets 始终能够获取图像标头中定义的帧大小。如果帧的尺寸小于图像标头中指定的大小,运算符将使用未定义的数据填充接收到的帧,以达到图像标头中指定的帧尺寸。填充较小的帧可能会导致后续帧丢失。系统会通过事件将丢失情况报告给软件,尺寸不匹配也会触发一个事件。

适用于以下硬件平台
imaFlex CXP-12 Penta
imaFlex CXP-12 Quad

在 VisualApplets 中进行实例化

该运算符在其输出端 O 上提供图像数据。此输出端始终存在。除此标准输出端口外,您还可以为 CXP 标头元数据配置一个可选的 MetaDataO 输出。在运算符实例化期间,将显示以下弹出对话框:

在此处,您可以指定可选的元数据端口。如果将端口可用性设置为“0”(默认值),则该运算符中将不存在此端口。如果将端口可用性设置为 1,则元数据端口将在运算符接口中可用。

可选的 MetaDataO 端口

32 位输出的格式如下图所示。

每个 CXP 帧都提供相应的无错误图像标头。对于不正确的图像标头,不会有图像流数据源源不断地输入到 VisualApplets 流水线中。压缩的图像标头由 6 个字(word)组成。最后一个字节用于附加信息,仅供内部使用。特别是,HeaderError 位用于指示图像标头本身是否出现错误。

图像标头 描述
StreamId CXP 流的 ID
Tag 16 位源图像索引。每传输一个图像,该索引就会递增,并在达到 0xFFFF 时回环归零。包含与同一图像相关的数据的每个流(在多抽头流的情况下)应使用相同的数字。
XSize 表示以像素为单位的图像宽度的 24 位值。
XOff 表示图像相对于完整设备图像最左侧像素的水平偏移量(以像素为单位)的 24 位值。
YSize 表示图像高度(以像素为单位)的 24 位值。对于线扫描图像,此值设置为 0。参数 CameraScanMode 始终显示由此值读取的相机类型。如果 O.Img Protocol 设置为 VALT_LINE1D,则处理时会忽略 YSize,并且运算符将所有传入数据输出为无尽的行流。如果图像协议设置为 VALT_IMAGE2D,YSize=0 也会导致产生无尽的行流。
YOff 表示图像相对于完整设备图像顶行的垂直偏移量(以像素为单位)的 24 位值。对于线扫图像,该值设置为 0。
DSizeL 表示每行图像的数据字数的 24 位值。
PixelF 表示 Pixel Format 的 16 位值。
TapG 表示抽头几何结构的 16 位值。
Flags 图像标志。
x-Mirror (暂未使用)。描述传入图像是否在 x 轴上进行了镜像。
y-Mirror (暂未使用)。描述传入图像是否在 y 轴上进行了镜像。
HeaderError

1:图像标头有错误,并且该帧被声明为丢失。运算符输出数据流中不存在相应的图像数据。

0:图像标头正确,运算符输出数据流中存在相应的图像数据。

[重要] Image Protocol:面阵和线阵相机

图像协议对相机运算符输出有两个不同的影响。

  • CXP 标头中的 YSize 值(0 = 线扫描;>0 = 面扫描)。

  • 运算符输出端 O.Img Protocol 上配置的协议(VALT_LINE1D = 线扫描;VALT_IMAGE2D = 面扫描)。

参数 CameraScanMode 始终显示从 CXP 标头读取的相机类型。如果 O.Img Protocol 设置为 VALT_LINE1D,则处理时会忽略 YSize,并且运算符将所有传入数据输出为无尽的行流。如果图像协议设置为 VALT_IMAGE2D,YSize=0 也会导致无尽的行流,从而产生超出 O Max Img Height 的图像。过大的图像可能会在设计中跟在 CxpCamera 运算符之后的运算符中导致未定义的行为。为避免这种情况,建议将传入的行流分割为多个图像,例如通过使用 SplitImage 运算符。

设备资源占用

运算符根据参数 ConnectionCount 的选择,使用一个或多个类型为 CameraPort 的资源。对于事件 系统,将使用类型为 EventPort 的资源。如果 ConnectionCount 设置为 X4(四通道),则资源对话框如下所示:

[重要] 修改图像宽度和图像高度

通过输出链接的最大图像宽度和高度属性,您可以将宽度和高度调整为相机特定的设置。但是,运算符端口 O 上的最大图像宽度 必须能被端口 O 的 Parallelism 整除。因此,请确保最大图像宽度能够被端口 O 的 Parallelism 整除!

错误处理与事件系统

当运算符检测到接收到的重建帧大于或小于相机在 CXP 图像标头中声明的大小时,会激活安全电路。然后,运算符会截断超出范围的像素和行,以便后续的处理流水线始终能够获取图像标头中定义的帧大小。如果接收到的帧尺寸小于图像标头中指定的大小,运算符将使用未定义的数据填充接收到的帧,以达到图像标头中指定的帧尺寸。填充较小的帧可能会导致后续帧丢失。随后会通过事件将丢失情况报告给软件(参见下段)。尺寸不匹配也会触发一个事件。

For a set of very critical errors, the operator will forward asynchronous events to the host runtime software (Framegrabber SDK). The event name in the Framegrabber API is <hierarchical operator name>\CxpStreamStatus, e.g. Device1\Process0\Camera\CxpStreamStatus. The event payload is provided as four 16-bit data words. The event format is defined as follows:

  • 字 [0]:

    • 位 [0:15]:发生事件的 CXP 图像标签。

  • 字 [1]:

    • 位 [8:15]:发生事件的流 ID。

    • 位 [0:7]:保留,作为无关项 (don't care) 处理。

  • 字 [2]:

    • 位 [0]:发生 CRC 错误。

    • 位 [1]:在图像标头中检测到流标记错误。

    • 位 [2]:检测到图像标头中存在无法纠正的错误。

    • 位 [3]:检测到帧大小错误,即 CXP 图像标头中定义的图像大小与传输数据包重建的帧大小不匹配。当相机在图像标头中放入一个信息,但传输的数据量与标头中通告的不同时,就会发生这种情况。

    • 位 [4:15]:保留,作为无关项 (don't care) 处理。

  • 字 [3]:

    • 位 [0]:事件类型,0 = Corrupted Entity,1 = Lost Entity。

      • Corrupted Entity 意味着错误发生在某个帧内部,并且该帧已经输入到 VisualApplets 流水线中。

      • Lost Entity 意味着错误发生在帧被转发到后续运算符之前,并且该帧已被相机运算符丢弃。

      • 当观察到损坏的实体时,操作符将根据 CXP 图像标头定义进行 Fill,以便后续操作符不会导致未定义的行为。在此 Fill 期间,可能会到达新帧,进而丢失。当相机根据帧标签发送带间隙的数据时,也会触发丢失实体事件。

    • bit [1]:发生类型为 Corrupted Entity 的事件丢失。这意味着先前类型为 Corrupted Entity 的事件已丢失。当运行时软件不对事件做出反应且内部事件队列满载时,就会发生这种情况。

    • bit [2]:发生类型为 Lost Entity 的事件丢失。这意味着先前类型为 Lost Entity 的事件已丢失。当运行时软件不对事件做出反应且内部事件队列满载时,就会发生这种情况。

    • bits [3:15]:丢失的 Lost Entity 事件的数量。

事件分为两种类型:损坏实体的事件和丢失实体的事件。word 3 的 bit 0 描述了发生了哪种类型的事件。如果事件缓冲区已满,可能会导致事件丢失。当标记损坏实体的事件丢失时,word 3 的 bit 1 将被置位。当标记丢失实体的事件丢失时,word 3 的 bit 2 将被置位,且 bit 3 到 15 将提供指示丢失帧的丢失事件数量。如果 bit 2 已置位但 Counter 为 0,则意味着发生了 Counter 溢出。

每个事件都会引发一个软件中断。为了 减少事件数量,可能会将具有相同帧标记(frame tag)的多个事件合并在一起。在这种情况下,某些错误标志会被组合。如果某个事件丢失,则丢失事件之前的事件将包含有关丢失事件的信息,并且不能与具有相同帧标记的后续事件合并。

因 CRC 错误引起的事件会报告一个帧标签,该标签可能不完全对应于发生 CRC 错误的帧。帧标签可能是前一帧或后一帧的标签。这种情况仅在相机发送包含 2 个或更多帧之间过渡的 CXP 数据包时才会发生。CRC 计算在数据包结束时完成,但流数据是动态重建的。这意味着可能会出现这种情况:在操作符已经发送前一帧之后检测到 CRC 错误。在正常情况下,如果相机数据包不包含正在进行的帧末尾和下一帧开头的数据,则 CRC 错误期间的帧标签将始终正确。对于所有其他情况,只要完整的帧流数据小于 8k 的最大数据包大小,一个数据包内可能只有 1 个帧重叠。在这种情况下,软件应用程序也应将帧标签为 -1 的前一帧和帧标签为 +1 的后一帧视为潜在损坏。

I/O Property

Property 值
Operator Type M
Output Links O,图像数据输出
MetaDataO,可选元数据输出

Supported Link Format

Link Parameter Output Link O 输出链路 MetaDataO
Bit Width 32
Arithmetic unsigned unsigned
Parallelism auto 1
Kernel Columns 1 1
Kernel Rows 1 1
Img Protocol {VALT_IMAGE2D, VALT_LINE1D} (default: VALT_IMAGE2D)1 {VALT_IMAGE2D, VALT_LINE1D, VALT_PIXEL0D} (default: VALT_IMAGE2D)
Color Format VAF_GRAY VAF_GRAY
Color Flavor FL_NONE FL_NONE
Max. Img Width 任意(默认:1032) 6
Max. Img Height 任意(默认:1032) 1

1

如果 O.Img Protocol 设置为 VALT_LINE1D,则处理时会忽略 CXP 标头中的 YSize 值,并且操作符会将所有传入数据输出为无尽的行流。如果图像协议设置为 VALT_IMAGE2D,YSize=0(线阵相机)也会导致无尽的行流,从而产生超出 O.Max.Img.Height 的图像。

参数

ConnectionCount
键入 静态写入参数
默认 X1
范围 {X1, X2, X4}

参数 ConnectionCount 定义了聚合到 CXP 链路的 CXP 通道数量。所用连接端口的索引 由类型为 CameraPort 的资源处理。 端口资源的数量与连接计数相匹配(例如 X2:两个 CameraPort 资源项)。

当您实例化多个 CxpCamera 算子(例如用于双相机 小程序)时,如果使用多个具有相同索引的资源,或者消耗的 CameraPort 资源数量超过最大值 4,则可能会发生资源冲突。在这种情况下,设计规则检查会报告错误。

ResetStatus
键入 动态写入参数
默认 熄灭
范围 {Off, On}

参数 ResetStatus 用于重置相机统计信息, 即错误计数器。

UsedConnections
键入 动态读取参数
默认
范围 {1,2,4}

参数 UsedConnections 显示了由发现软件在运行时配置的 CXP 通道数量。

PacketTagErrorCount
键入 动态读取参数
默认
范围 [0 : 8191]

参数 PacketTagErrorCount 显示有多少接收到的数据包带有不符合 CXP 标准预期标签的标签。特别是,当在后续流数据包标签枚举中观察到间隙时,该值会递增。该参数为 13 位宽,其中位 [11:0] 代表实际的 Counter 值,位 [12] 代表 Counter 溢出。当设置溢出位时,Counter 值应视为无关项 (don't care)。

ImageTagErrorCount
键入 动态读取参数
默认
范围 [0 : 8191]

该参数用于统计图像头部标签、根据 CXP 标准预期的标签以及收到的标签之间出现多少次不匹配。该参数位宽为 13 位,其中位 [11:0] 表示实际的 Counter 值,位 [12] 代表 Counter 溢出。当设置了溢出位时,应将 Counter 值视为无关项。

StreamIdErrorCount
键入 动态读取参数
默认
范围 [0 : 8191]

该参数用于统计流数据包中收到的流 ID 值与图像头部中指定的流 ID 值不匹配的频率。该参数位宽为 13 位,其中位 [11:0] 表示实际的 Counter 值,位 [12] 代表 Counter 溢出。当设置了溢出位时,应将 Counter 值视为无关项。

CorrectedErrorCount
键入 动态读取参数
默认
范围 [0 : 8191]

该参数用于统计图像头部或行标记中检测到的多少个错误已被纠正。该参数位宽为 13 位,其中位 [11:0] 表示实际的 Counter 值,位 [12] 代表 Counter 溢出。当设置了溢出位时,应将 Counter 值视为无关项。

UncorrectedErrorCount
键入 动态读取参数
默认
范围 [0 : 8191]

该参数用于统计由于同一字节中存在多个位错误而无法纠正的图像头部或行标记中检测到的错误数量。该参数位宽为 13 位,其中位 [11:0] 表示实际的 Counter 值,位 [12] 代表 Counter 溢出。当设置了溢出位时,应将 Counter 值视为无关项。

PacketBufferOverflowCount
键入 动态读取参数
默认
范围 [0 : 8191]

该参数用于统计聚合模式下通道绑定中发生数据包缓冲区溢出的频率。该参数仅对 ConnectionCount = X2 或 X4 有效。该参数位宽为 13 位,其中位 [11:0] 表示实际的 Counter 值,位 [12] 代表 Counter 溢出。当设置了溢出位时,应将 Counter 值视为无关项。

PacketBufferOverflowSource
键入 动态读取参数
默认
范围 [0x0 : 0xf]

该参数实现了一个位掩码,用于查询数据包缓冲区溢出发生在 4 个潜在 CXP 通道中的哪一个。参数宽度取决于参数 ConnectionCount。在 X1 模式下,参数宽度为 1 位;在 X2 模式下,参数宽度为 2 位;在 X4 模式下,参数宽度为 4 位。顺序为:LSB = 最低 CXP 通道号,MSB = 操作员分配的最高 CXP 通道号。

CameraScanMode
键入 动态读取参数
默认
范围 {area,line}

接收到的图像标头包含流是用于面阵扫描(YSize > 0)还是用于线阵扫描(YSize = 0)应用的信息。此参数显示最后有效接收到的流图像标头信息。

MarkerErrorCount
键入 动态读取参数
默认
范围 [0 : 8191]

该参数用于统计 CXP 流标记与标头或行标记的序列错误的发生次数。该参数宽度为 13 位,其中位 [11:0] 表示实际的 Counter 值,位 [12] 表示 Counter 溢出。当设置了溢出位时,应忽略 Counter 值。

UnexpectedStartupData
键入 动态读取参数
默认
范围 {false, true}

该参数用于检测在算子重置后第一个数据值出现异常的错误情况,即此前未接收到图像标头。这种情况可能是由相机漏洞、采集卡固件实现缺陷或发现过程的软件控制错误引起的。理论上,相机的硬件故障也可能导致这种情况。

FrameLostCount
键入 动态读取参数
默认
范围 [0 : 33554431]

该参数用于统计在采集过程中丢失且未发送到 VisualApplets 流水线中的帧数。当检测到图像标头错误或一帧与另一帧重叠时,帧会丢失。该参数宽度为 25 位,其中位 [23:0] 表示实际的 Counter 值,位 [24] 表示 Counter 溢出。当设置了溢出位时,应忽略 Counter 值。

FrameCorruptedCount
键入 动态读取参数
默认
范围 [0 : 33554431]

该参数用于统计采集过程中损坏的帧数。损坏的帧是指带有错误像素并被发送到 VisualApplets 流水线中的帧。该参数宽度为 25 位,其中位 [23:0] 表示实际的 Counter 值,位 [24] 表示 Counter 溢出。当设置了溢出位时,应忽略 Counter 值。

使用示例

以下示例展示了 CxpCamera 操作符的使用: